package com.jie.eduservice.controller;


import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jie.commonutils.ResultEntity;
import com.jie.eduservice.entity.EduCourse;
import com.jie.eduservice.entity.vo.CourseInfoVO;
import com.jie.eduservice.entity.vo.CoursePublishVO;
import com.jie.eduservice.entity.vo.CourseQueryVO;
import com.jie.eduservice.service.EduCourseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 * 课程 前端控制器
 * </p>
 *
 * @author xzj
 * @since 2020-10-09
 */
//@CrossOrigin  // 解决跨域问题
@RestController
@RequestMapping("/eduservice/course")
public class EduCourseController {

    private final EduCourseService eduCourseService;

    @Autowired
    public EduCourseController(EduCourseService eduCourseService) {
        this.eduCourseService = eduCourseService;
    }

    /**
     * 获取新建课程表单信息并添加
     * 补充: 前端要提交三次表单, 而且的一步一步提交的, 因此可以用redis保存前两次, 到最后一步的
     *      保存再同时提交(但因为老师没这样写, 就先不这样写, 先有个思路算了)
     *      保存到redis中的时候可以用用户名+一个唯一值来代表这一个暂时存储的课程信息
     * @param courseInfoVO 前端传来的表单信息
     * @return             返回后端是否执行方法成功
     */
    @PostMapping("/addCourseInfo")
    public ResultEntity addCourseInfo(
            @RequestBody CourseInfoVO courseInfoVO
            ) {
        // 返回添加后的课程id, 为了后面添加大纲使用
        String id = eduCourseService.saveCourseInfo(courseInfoVO);
        return ResultEntity.ok().data("courseId", id);
    }

    /**
     * 根据课程id查询课程基本信息
     * 若是用redis的话, 可以通过前端传来的用户名+唯一id值的信息获取到上一步保存到redis的课程信息
     * @param courseId  要查询的课程id
     * @return          返回课程信息
     */
    @GetMapping("/getCourseInfo/{courseId}")
    public ResultEntity getCourseInfo(
            @PathVariable("courseId") String courseId
    ) {
        CourseInfoVO courseInfoVO = eduCourseService.getCourseInfo(courseId);
        return ResultEntity.ok().data("courseInfoVO", courseInfoVO);
    }

    /**
     * 更新课程信息
     * @param courseInfoVO  前端传入的要更新的课程信息
     * @return              返回更新是否成功的信息
     */
    @PostMapping("/updateCourseInfo")
    public ResultEntity updateCourseInfo(
            @RequestBody CourseInfoVO courseInfoVO
    ) {
        eduCourseService.updateCourseInfo(courseInfoVO);
        return ResultEntity.ok();
    }

    /**
     * 根据课程id查询课程确认信息
     * @param id  课程id
     * @return    返回课程确认信息
     */
    @GetMapping("/getPublishCourseInfo/{id}")
    public ResultEntity getPublishCourseInfo(
            @PathVariable("id") String id
    ) {
        CoursePublishVO coursePublishVO = eduCourseService.getPublishCourseInfo(id);
        return ResultEntity.ok().data("publishCourse", coursePublishVO);
    }

    /**
     * 根据id最终发布课程, 修改发布状态
     * 我觉得这一步应该是把redis中的前两步数据保存到数据库中
     * @param id  要发布的课程id
     * @return    返回发布是否成功
     */
    @PostMapping("/publishCourse/{id}")  // 只要涉及到修改操作, 就用Post或Put
    public ResultEntity publishCourse(
        @PathVariable("id") String id
    ) {
        EduCourse eduCourse = new EduCourse();
        eduCourse.setId(id);
        eduCourse.setStatus("Normal");  // 设置课程为发布状态
        eduCourseService.updateById(eduCourse);
        return ResultEntity.ok();
    }

    /**
     * 获取所有课程列表(分页查询)
     * @param current  当前页
     * @param limit    每页记录数
     * @return         返回所有课程列表
     */
    @GetMapping("/{current}/{limit}")
    public ResultEntity getCourseList(
            @PathVariable("current") Long current,
            @PathVariable("limit") Long limit
    ) {
        Page<EduCourse> coursePage = new Page<>(current, limit);
        eduCourseService.page(coursePage, null);
        Long total = coursePage.getTotal();
        List<EduCourse> list = coursePage.getRecords();
        return ResultEntity.ok().data("total", total).data("list", list);
    }

    /**
     * 获取课程列表(分页, 条件)
     * @param current        当前页
     * @param limit          一页多少条数据
     * @param courseQueryVO  查询条件
     * @return               返回查询到的课程列表
     */
    @PostMapping("/pageCourseCondition/{current}/{limit}")
    public ResultEntity pageCourseCondition(
            @PathVariable("current") Long current,
            @PathVariable("limit") Long limit,
            @RequestBody(required = false) CourseQueryVO courseQueryVO
            ) {
        Page<EduCourse> coursePage = eduCourseService.pageCourseCondition(current, limit, courseQueryVO);
        Long total = coursePage.getTotal();
        List<EduCourse> records = coursePage.getRecords();
        return ResultEntity.ok().data("total", total).data("list", records);
    }

    /**
     * 删除课程的方法
     * @param courseId  要删除的课程id
     * @return          返回成功状态
     */
    @DeleteMapping("/{courseId}")
    public ResultEntity deleteCourse(
            @PathVariable("courseId") String courseId
    ) {
        eduCourseService.removeCourse(courseId);
        return ResultEntity.ok();
    }

}

